# kind: Template

Конфигурация предназначена для валидации условий обработки rego-правил.

Перед началом реализации необходимо ознакомиться с ограничениями валидации, которые описываются в рамках конфигурации «kind: Scope»


| Поле          | Назначение               |
|---------------|--------------------------|
| [data](#data) | Описание условий для валидации. Обязательное поле |
| [kind](#kind) | Вид валидируемого ресурса в рамках кластера |
| [type](#type) | Значение rego, если конфигурация «kind: Template» содержит логику rego                         |


## data

Это поле позволяет описать секции ресурса, которые будут валидированы. Есть возможность использовать goTemplate аналогично синтаксису в helm. 

Примеры:

```yaml
kind: Template
apiVersion: kubelatte.io/v1alpha1
metadata:
  name: validator-template
  namespace: validator-namespace
spec:
  apiVersion: apps/v1
  kind: Deployment
  data: |-
    metadata:
      labels:
        deployment: to-find-deployment-univrsal-validator-simillar-scopes
    spec:
      strategy:
        type: Recreate
      replicas: 1
      selector:
        matchLabels:
          app: latte
      template:
        metadata:
          labels:
            disallowed: enabled
            app: latte
            find-pod: example-latte
            sidecar.istio.io/inject: "false"
          annotations:
            networking.kubelatte.io/replace: enabled
            networking.kubelatte.io/merge: enabled
            networking.kubelatte.io/new: enabled
        spec:
          containers:
            - name: nginx
              image: noimage5
              args:
                - arg11
                - arg12
```

C использованием rego-правил:

```yaml
kind: Template
apiVersion: kubelatte.io/v1alpha1
metadata:
  name: tmpl-rego-no-http
  namespace: $NAMESPACE
spec:
  type: rego
  data: |-
    import future.keywords.contains
    import future.keywords.if
    
    violation contains {"msg": msg} if {
      objName := "hello"
      msg := sprintf("There is no HTTP. Just '%v'!", [objName])
    }
```

## type

Необязательный параметр, который принимает значение "rego", если конфигурация «kind: Template» содержит логику rego. При невалидном синтаксисе кода rego валидация ресурса не будет выполнена успешно

Пример конфигурации типа rego:

```yaml
kind: Template
apiVersion: kubelatte.io/v1alpha1
metadata:
  name: rego-matchconditions
  namespace: rego-namespace
spec:
  type: rego # метка, что в указанном блоке будет реализован код на regoRule
  data: |-    
    # rego-code, for example: 

    import future.keywords.contains
    import future.keywords.if
    import future.keywords.in
    
    violation contains {"msg": msg} if {
      params := object.get(input, "parameters", {})
      name := object.get(params, "name", [])
      objName := input.review.name
      objName == name
      msg := sprintf("Creating this resource is prohibited! Don't create %v", [objName])
    }
```

Более подробно об использовании семантики Rego можно ознакомится на [сайте](https://www.openpolicyagent.org/). Указанный механизм позволит реализовать более сложную логику валидации объектов Kubernetes.

Также можно воспользоваться тестовой средой, по [ссылке](https://play.openpolicyagent.org/). Для этого необходимо в левом окне написать правила Rego, в правом верхнем окне "INPUT" добавить JSON.